import java.util.Arrays;
import java.util.Scanner;

/**
 * @author sjp
 * @date 2021/3/12 3:35
 * @description 实现自定义数组长度，动态扩容
 */
public class CustomArrays {
    public static void main(String[] args) {
        //定义Scanner对象
        Scanner scanner = new Scanner(System.in);

        //1.让用户输入一个数组长度
        System.out.println("请输入需要设定的数组长度:");
        int arrLength = scanner.nextInt();

        //2.根据用户输入的数组长度，创建数组对象
        int[] intArrays = new int[arrLength];

        System.out.println("程序已开始执行，可随时输入\"exit\"退出");

        //3.请用户输入数组中的元素
        for (int i = 0; i < intArrays.length; i++) {
            System.out.println("请输入数组中，第" + (i + 1) + "位的值:");

            //此处修改希望允许输入exit进行退出，当输入的不为”exit“时默认为整数
            String currInput = scanner.next();
            if ("exit".equals(currInput)) {
                //当输入为exit时，退出当前循环，不再往数组中输入数值
                System.out.println("当前数组中的值为:" + Arrays.toString(intArrays));
                break;
            } else {
                //不为exit时，默认为整型，需要做个类型转换
                intArrays[i] = Integer.parseInt(currInput);
            }

            //4.计算需要扩容的值是多少  （原数组长度的80%）
            int growthValue = (int) (intArrays.length * 0.8);

            //5.判断到当前用户输入的索引，已经到达了数组需要扩容的值时，需要进行数组扩容
            if (i >= growthValue - 1) {
                //原长度*1.5为新长度，此处使用Math工具类中的round方法进行四舍五入
                //写为1.5f 是为了让入参为float类型，这样编译器解析的时候会使用返回值为int类型的round重载方法
                int newArraysLength = Math.round(intArrays.length * 1.5f);

                //6.使用Arrays工具类中的copyOf方法复制一个新数组
                intArrays = Arrays.copyOf(intArrays, newArraysLength);

                System.out.println("数组发生扩容，新数组长度为:" + newArraysLength);
                System.out.println("当前数组中的值为:" + Arrays.toString(intArrays));
            }
        }
    }
}
